/* -----------------
* brief
* 1. this is code gen by tools
* 2. mvc code are driver by the model defined with the same filename,
	 for example:
	 there is a Xmodel struct define in xmodel.go file, after the script run (lego model-mvc module_name xmodel)
     it will auto create the code under the module's path
	 m --> xmodel.go
	 v --> view
	 c --> xmodel_ctrl
* 3. you should modify this code if it doesn't satisfy your purpose
*/

package controller

import (
	wxcardlib "github.com/chanxuehong/wechat/mp/card"
	"github.com/mjiulee/lego"
	"github.com/mjiulee/lego/utils"
	"github.com/valyala/fasthttp"

	. "saas_sys_base/modules/merchantCard/models"
	. "saas_sys_base/modules/merchantCard/service"

	"saas_sys_base/common"
)

type MchUserMemberCardCtrl struct {
	service MchUserMemberCardService
}

func init() {
	vc := new(MchUserMemberCardCtrl)
	_ctrlList = append(_ctrlList, vc)
}

func (vc *MchUserMemberCardCtrl) CtrlInfo() string {
	return "MchUserMemberCardCtrl"
}

func (vc *MchUserMemberCardCtrl) RoutInit() {
	// 列表页面
	lego.GET("/admin/merchantCard/MchUserMemberCard/listpage", vc.ListPage, lego.LEGO_SESSION_TYPE_ADMIN, false)
	lego.GET("/admin/merchantCard/MchUserMemberCard/listjson", vc.ListJson, lego.LEGO_SESSION_TYPE_ADMIN, false)
	// 编辑页面
	lego.GET("/admin/merchantCard/MchUserMemberCard/editpage", vc.GetEditPage, lego.LEGO_SESSION_TYPE_ADMIN, false)
	lego.POST("/admin/merchantCard/MchUserMemberCard/editpage", vc.PostEditPage, lego.LEGO_SESSION_TYPE_ADMIN, false)
	// 删除
	lego.POST("/admin/merchantCard/MchUserMemberCard/del", vc.DelRecode, lego.LEGO_SESSION_TYPE_ADMIN, false)

	//租户管理端接口
	lego.GET("/admin/merchantCard/MchUserMemberCard/listpage_saas", vc.ListPage_Saas, lego.LEGO_SESSION_TYPE_ADMIN, false)
	lego.GET("/admin/merchantCard/MchUserMemberCard/listjson_saas", vc.ListJson_Saas, lego.LEGO_SESSION_TYPE_ADMIN, false)

	lego.GET("/admin/merchantCard/MchUserMemberCard/editpage_saas", vc.GetEditPage_Saas, lego.LEGO_SESSION_TYPE_ADMIN, false)
}

/* 列表接口
* params:
  ---
*/
func (vc *MchUserMemberCardCtrl) ListJson(ctx *fasthttp.RequestCtx) {
	ctxExt := lego.RequestCtxExtent{ctx}
	response := make(map[string]interface{})
	code := 0
	msg := ""

	for {
		//:saas管理端使用代码，使用时将注释解开 sessionData := common.GetSessionData(&ctxExt)
		//:appwho := sessionData.AppTokenWho

		// 表单校验
		type ReqParams struct {
			Keyword string // 关键字查询
			Page    int    `vd:"$>0"` // 分页
			PSize   int    `vd:"$>0"` // 分页大小

			OrderField string
			Order      string `vd:"$=='' || $=='asc' || $=='desc'"`
		}
		req := ReqParams{
			Keyword:    string(ctxExt.Peek("keyword")),
			Page:       utils.BytesToInt(ctxExt.Peek("page")),
			PSize:      utils.BytesToInt(ctxExt.Peek("limit")),
			OrderField: string(ctxExt.Peek("order_field")),
			Order:      string(ctxExt.Peek("order")),
		}
		if err := lego.Validate(req); err != nil {
			code = 100
			msg = err.Error()
			break
		}

		// 业务查询
		if list, total, err := vc.service.ListMchUserMemberCard(req.Keyword, req.Page, req.PSize, req.OrderField, req.Order); err != nil {
			code = 100
			msg = "fail"
			lego.LogError(err)
		} else {
			response["count"] = total
			response["data"] = list
		}
		break
	}

	response["code"] = code
	response["msg"] = msg
	ctxExt.JSON(200, response)
	return
}

/* 添加数据记录
* params:
  ---
*/
func (vc *MchUserMemberCardCtrl) ListPage(ctx *fasthttp.RequestCtx) {
	ctxExt := lego.RequestCtxExtent{ctx}
	data := make(map[string]interface{})
	for {
		sessionData := common.GetSessionData(&ctxExt) //
		appwho := sessionData.AppTokenWho
		data["Who"] = appwho //adminSaas(租户管理端)使用的变量
		break
	}
	ctxExt.HTML("merchantCard/view/MchUserMemberCard/list.html", data)
	return
}

/* 添加数据记录
* params:
  ---
*/
func (vc *MchUserMemberCardCtrl) GetEditPage(ctx *fasthttp.RequestCtx) {
	ctxExt := lego.RequestCtxExtent{ctx}
	data := make(map[string]interface{})
	for {
		sessionData := common.GetSessionData(&ctxExt) //
		appwho := sessionData.AppTokenWho
		data["Who"] = appwho //adminSaas(租户管理端)使用的变量

		type ReqParams struct {
			Id int64 // 记录id，为空则新建，否则为编辑
		}
		req := ReqParams{
			Id: utils.BytesToInt64(ctxExt.Peek("id")),
		}
		if err := lego.Validate(req); err != nil {
			break
		}
		target := vc.service.GetMchUserMemberCardById(req.Id)
		data["detail"] = target
		break
	}
	ctxExt.HTML("merchantCard/view/MchUserMemberCard/edit.html", data)
	return
}

/* 数据编辑
* params:
  ---
*/
func (vc *MchUserMemberCardCtrl) PostEditPage(ctx *fasthttp.RequestCtx) {
	ctxExt := lego.RequestCtxExtent{ctx}
	response := make(map[string]interface{})
	data := make(map[string]interface{})

	code := 0
	msg := ""

	for {
		//:saas管理端使用代码，使用时将注释解开 sessionData := common.GetSessionData(&ctxExt)
		//:appwho := sessionData.AppTokenWho

		// 表单校验
		type ReqParams struct {
			//#ModelEditFormDefined#
			Id                  int64                      `vd:""`
			IfDel               int                        `vd:""`
			Cdate               string                     `vd:""`
			Udate               string                     `vd:""`
			Who                 common.Who                 `vd:""`
			MchCardId           int64                      `vd:""`
			WeappId             string                     `vd:""`
			UserCardCode        string                     `vd:""`
			WxCardId            string                    `vd:""`
			Status    wxcardlib.USER_CARD_STATUS `vd:""`
			IsGiveByFriend      int                        `vd:""`
			FriendUserName      string                     `vd:""`
			OldUserCardCode     string                     `vd:""`
			OuterId             int64                      `vd:""`
			OuterStr            string                     `vd:""`
			IsRestoreMemberCard int                        `vd:""`
			IsRecommendByFriend int                        `vd:""`
			UnionId             string                     `vd:""`
			Bonus               int                        `vd:""`
			Balance             int                        `vd:""`
		}
		req := ReqParams{
			//#ModelEditFormFiled#
			Id:    utils.BytesToInt64(ctxExt.Peek("id")),
			IfDel: utils.BytesToInt(ctxExt.Peek("if_del")),
			Cdate: string(ctxExt.Peek("cdate")),
			Udate: string(ctxExt.Peek("udate")),
			//Who:   string(ctxExt.Peek()), //不支持嵌入类型，请自行填充

			MchCardId:        utils.BytesToInt64(ctxExt.Peek("mch_card_id")),
			WeappId:          string(ctxExt.Peek("weapp_id")),
			UserCardCode:     string(ctxExt.Peek("user_card_code")),
			WxCardId:           string(ctxExt.Peek("wx_card_id")),
			Status: wxcardlib.USER_CARD_STATUS(ctxExt.Peek("status")), //不支持嵌入类型，请自行填充

			IsGiveByFriend:      utils.BytesToInt(ctxExt.Peek("is_give_by_friend")),
			FriendUserName:      string(ctxExt.Peek("friend_user_name")),
			OldUserCardCode:     string(ctxExt.Peek("old_user_card_code")),
			OuterId:             utils.BytesToInt64(ctxExt.Peek("outer_id")),
			OuterStr:            string(ctxExt.Peek("outer_str")),
			IsRestoreMemberCard: utils.BytesToInt(ctxExt.Peek("is_restore_member_card")),
			IsRecommendByFriend: utils.BytesToInt(ctxExt.Peek("is_recommend_by_friend")),
			UnionId:             string(ctxExt.Peek("union_id")),
			Bonus:               utils.BytesToInt(ctxExt.Peek("bonus")),
			Balance:             utils.BytesToInt(ctxExt.Peek("balance")),
		}
		if err := lego.Validate(req); err != nil {
			code = 100
			msg = err.Error()
			break
		}

		// 业务处理
		recode := vc.service.GetMchUserMemberCardById(req.Id)
		if recode == nil {
			// 新建
			recode := new(MchUserMemberCard)
			//#ModelFiledMapper#'
			recode.Id = req.Id
			recode.IfDel = req.IfDel
			recode.Cdate = req.Cdate
			recode.Udate = req.Udate
			recode.Who = req.Who
			recode.MchCardId = req.MchCardId
			recode.WeappId = req.WeappId
			recode.UserCardCode = req.UserCardCode
			recode.WxCardId = req.WxCardId
			recode.Status = req.Status
			recode.IsGiveByFriend = req.IsGiveByFriend
			recode.FriendUserName = req.FriendUserName
			recode.OldUserCardCode = req.OldUserCardCode
			recode.OuterId = req.OuterId
			recode.OuterStr = req.OuterStr
			recode.IsRestoreMemberCard = req.IsRestoreMemberCard
			recode.IsRecommendByFriend = req.IsRecommendByFriend
			recode.UnionId = req.UnionId
			recode.Bonus = req.Bonus
			recode.Balance = req.Balance

			if false == vc.service.SaveMchUserMemberCard(recode) {
				code = 100
				msg = "false"
				break
			}
		} else {
			//#ModelFiledMapper#
			recode.Id = req.Id
			recode.IfDel = req.IfDel
			recode.Cdate = req.Cdate
			recode.Udate = req.Udate
			recode.Who = req.Who
			recode.MchCardId = req.MchCardId
			recode.WeappId = req.WeappId
			recode.UserCardCode = req.UserCardCode
			recode.WxCardId = req.WxCardId
			recode.Status = req.Status
			recode.IsGiveByFriend = req.IsGiveByFriend
			recode.FriendUserName = req.FriendUserName
			recode.OldUserCardCode = req.OldUserCardCode
			recode.OuterId = req.OuterId
			recode.OuterStr = req.OuterStr
			recode.IsRestoreMemberCard = req.IsRestoreMemberCard
			recode.IsRecommendByFriend = req.IsRecommendByFriend
			recode.UnionId = req.UnionId
			recode.Bonus = req.Bonus
			recode.Balance = req.Balance

			if nil != vc.service.UpdateMchUserMemberCard(recode) {
				code = 100
				msg = "false"
				break
			}
		}
		break
	}
	response["code"] = code
	response["msg"] = msg
	response["data"] = data
	ctxExt.JSON(200, response)
	return
}

/* 删除数据记录
* params:
  ---
*/
func (vc *MchUserMemberCardCtrl) DelRecode(ctx *fasthttp.RequestCtx) {
	ctxExt := lego.RequestCtxExtent{ctx}
	response := make(map[string]interface{})
	data := make(map[string]interface{})

	code := 0
	msg := ""
	for {
		// 表单校验
		type ReqParams struct {
			Id int64 `vd:"$>0"` // 记录id
		}
		req := ReqParams{
			Id: utils.BytesToInt64(ctxExt.Peek("id")),
		}
		if err := lego.Validate(req); err != nil {
			break
		}
		// 业务删除
		target := vc.service.GetMchUserMemberCardById(req.Id)
		if target == nil {
			code = 100
			msg = "记录不存在"
			break
		}

		if false == vc.service.DelMchUserMemberCardById(target.Id) {
			code = 100
			msg = "操作失败"
			break
		}
		break
	}

	response["code"] = code
	response["msg"] = msg
	response["data"] = data
	ctxExt.JSON(200, response)
	return
}

//租户管理端 for saas ********
/* 列表接口
* params:
  ---
*/
func (vc *MchUserMemberCardCtrl) ListJson_Saas(ctx *fasthttp.RequestCtx) {
	ctxExt := lego.RequestCtxExtent{ctx}
	response := make(map[string]interface{})
	code := 0
	msg := ""

	for {
		sessionData := common.GetSessionData(&ctxExt)
		appwho := sessionData.AppTokenWho

		// 表单校验
		type ReqParams struct {
			Keyword string // 关键字查询
			Page    int    `vd:"$>=0"` // 分页
			PSize   int    `vd:"$>0"`  // 分页大小

			OrderField string
			Order      string `vd:"$=='' || $=='asc' || $=='desc'"`
		}
		req := ReqParams{
			Keyword:    string(ctxExt.Peek("keyword")),
			Page:       utils.BytesToInt(ctxExt.Peek("page")),
			PSize:      utils.BytesToInt(ctxExt.Peek("limit")),
			OrderField: string(ctxExt.Peek("order_field")),
			Order:      string(ctxExt.Peek("order")),
		}
		if err := lego.Validate(req); err != nil {
			code = 100
			msg = err.Error()
			break
		}

		// 业务查询
		if list, total, err := vc.service.ListMchUserMemberCardByWho(appwho, req.Keyword, req.Page, req.PSize, req.OrderField, req.Order); err != nil {
			lego.LogError(err)
		} else {
			response["count"] = total
			response["data"] = list
		}
		break
	}

	response["code"] = code
	response["msg"] = msg
	ctxExt.JSON(200, response)
	return
}

/* 添加数据记录
* params:
  ---
*/
func (vc *MchUserMemberCardCtrl) ListPage_Saas(ctx *fasthttp.RequestCtx) {
	ctxExt := lego.RequestCtxExtent{ctx}
	data := make(map[string]interface{})
	for {
		sessionData := common.GetSessionData(&ctxExt) //
		appwho := sessionData.AppTokenWho
		data["Who"] = appwho //adminSaas(租户管理端)使用的变量
		break
	}
	ctxExt.HTML("merchantCard/view/MchUserMemberCard/list_saas.html", data)
	return
}

/* 添加数据记录
* params:
  ---
*/
func (vc *MchUserMemberCardCtrl) GetEditPage_Saas(ctx *fasthttp.RequestCtx) {
	ctxExt := lego.RequestCtxExtent{ctx}
	data := make(map[string]interface{})
	for {
		sessionData := common.GetSessionData(&ctxExt) //
		appwho := sessionData.AppTokenWho
		data["Who"] = appwho //adminSaas(租户管理端)使用的变量

		type ReqParams struct {
			Id int64 // 记录id，为空则新建，否则为编辑
		}
		req := ReqParams{
			Id: utils.BytesToInt64(ctxExt.Peek("id")),
		}
		if err := lego.Validate(req); err != nil {
			break
		}
		target := vc.service.GetMchUserMemberCardById(req.Id)
		data["detail"] = target
		break
	}
	ctxExt.HTML("merchantCard/view/MchUserMemberCard/edit_saas.html", data)
	return
}
